package com.chenfan.mcn.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chenfan.mcn.enums.ApprovalEnum;
import com.chenfan.mcn.model.ApprovalFlow;
import com.chenfan.mcn.model.dto.ApprovalFlowDTO;
import com.chenfan.process.dto.ApprovalMapDTO;
import com.chenfan.process.vo.ApprovalNodeVO;
import com.chenfan.process.vo.ApprovalOperationVO;
import com.chenfan.process.vo.NextNotifyVo;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 业务工作流关联表 服务类
 * </p>
 *
 * @author lizhejin
 * @since 2021-01-26
 */
public interface ApprovalFlowService extends IService<ApprovalFlow> {


    /**
     * 提交 流程
     *
     * @param srcId  单据id
     * @param businessCode   跳转单据编号
     * @param approvalEnum {@link ApprovalEnum}
     * @param param     未知参数
     */
    void startProcess(Long srcId, String businessCode, ApprovalEnum approvalEnum, String param);

    /**
     * 提交 流程
     * @param srcId 单据id
     * @param businessCode   跳转单据编号
     * @param approvalEnum {@link ApprovalEnum}
     * @param param     未知参数
     * @param checkFile 未知参数
     */
    void startProcess(Long srcId, String businessCode, ApprovalEnum approvalEnum, String param, String checkFile);

    /**
     * 提交 流程
     * @param srcId     单据id
     * @param businessId     跳转单据id
     * @param businessCode   跳转单据编号
     * @param approvalEnum {@link ApprovalEnum}
     * @param param     未知参数
     * @param checkFile 未知参数
     */
    void startProcess(Long srcId, Long businessId, String businessCode, ApprovalEnum approvalEnum, String param, String checkFile);

    /**
     * 获取符合工作流中节点状态的业务id集合
     *
     * @param flowUserIds 对应审批流中的审批人集合
     * @param processId  流程id
     * @return 对接业务id集合
     */
    List<Long> getSrcList(List<Long> flowUserIds, Long processId);

    /**
     * 获取符合工作流中节点状态的业务id集合
     *
     * @param flowUserIds 对应审批流中的审批人集合
     * @param processIds  流程id集合
     * @return 对接业务id集合
     */
    List<Long> getSrcList(List<Long> flowUserIds, List<Long> processIds);

    /**
     * 撤回流程
     *
     * @param srcId     单据id
     * @param processId 流程模板id
     */
    void revokeProcess(Long srcId, Long processId);

    /**
     * 获取对应流程数据列表中的节点名称
     *
     * @param flowList 流程id
     * @return 流程id对应节点
     */
    JSONObject getFlowStatus(List<Long> flowList);

    /**
     * 调用消息 封装
     *
     * @param srcId           单据id
     * @param srcCode         单据code
     * @param approvalEnum    {@link ApprovalEnum}
     * @param status          成功通知 或 失败通知 待办不发
     * @param targetUserId    目标用户id
     * @param targetUserName  目标用户名字
     * @param approvalFlowDTO
     */
    void sendNotify(ApprovalFlowDTO approvalFlowDTO, Long srcId, String srcCode, ApprovalEnum approvalEnum, Boolean status, Long targetUserId, String targetUserName);


    /**
     * 调用消息 封装（商务提成）
     *
     * @param processId       流程id
     * @param srcId           单据id
     * @param srcCode         单据code
     * @param title           提成单标题
     * @param approvalEnum    {@link ApprovalEnum}
     * @param status          状态
     * @param targetUserId    目标用户id
     * @param targetUserName  目标用户名字
     * @param messageProgress 标识（1-个人提成，2-部门提成）
     */
    void sendBusinessNotify(Long processId, Long srcId, String srcCode, String title, ApprovalEnum approvalEnum, boolean status, Long targetUserId, String targetUserName, Integer messageProgress);

    /**
     * 调用消息 封装（AE提成）
     *
     * @param processId       流程id
     * @param srcId           单据id
     * @param srcCode         单据code
     * @param quarterCode     季度编号
     * @param approvalEnum    {@link ApprovalEnum}
     * @param status          状态
     * @param targetUserId    目标用户id
     * @param targetUserName  目标用户名字
     * @param messageProgress 标识（1-个人提成，2-部门提成）
     */
    void sendAeNotify(Long processId, Long srcId, String srcCode, String quarterCode, ApprovalEnum approvalEnum, boolean status, Long targetUserId, String targetUserName, Integer messageProgress);

    /**
     * 获取流程id
     *
     * @param srcId     {@link Long}
     * @param processId {@link Long}
     * @return List<Long>
     */
    List<Long> getFlowIds(Long srcId, Long processId);

    /**
     * 获取流程id
     *
     * @param srcId     {@link Long}
     * @param processId {@link Long}
     * @return Long
     */
    Long getFlowId(Long srcId, Long processId);

    /**
     * 获取流程id
     *
     * @param srcId     {@link Long}
     * @param processId {@link Long}
     * @return String
     */
    String getStringFlowIds(Long srcId, Long processId);


    /**
     * 当前审批流信息
     * @param approvalMap
     * @return
     */
    Map<Long, String> approvalToMap(ApprovalMapDTO approvalMap);

    /**
     * 查询各节点的最新的流程实例ID
     * @param srcIds
     * @param processIds
     * @return
     */
    Map<Long,Long> getNewestFlowIds(List<Long> srcIds, List<Long> processIds);

    /**
     *获取当前审批节点信息
     * @param srcIds
     * @param processIds
     * @return
     */
    Map<Long, ApprovalNodeVO> getCurrentApprovalNodes(List<Long> srcIds, List<Long> processIds);

    /**
     * 审批流程
     * @param approvalId
     * @param parameter
     * @param approvalFlag
     * @param remark
     * @return
     */
    ApprovalOperationVO approvalChange(Long approvalId, String parameter, Boolean approvalFlag, String remark);

    /**
     * 审批流程
     * @param approvalId
     * @param parameter
     * @param approvalFlag
     * @param remark
     * @return
     */
    NextNotifyVo approvalChangeNext(Long approvalId, String parameter, Boolean approvalFlag, String remark);

}
